Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / helpers / esp32 / SerialWifiInterface.cpp

Displaying Raw • Download

src/helpers/esp32/SerialWifiInterface.cpp 890a2e2cffa98dea3ca88db3c3aba72ef23ff3f7 (890a2e2c) Text, 4.82 KB

Tff7b72#Tff7b72include T8b949e"SerialWifiInterface.h"
Tff7b72#Tff7b72include T8b949e<WiFi.h>

Tffa657void Td2a8ffSerialWifiInterface::beginTb4b4b4(Tffa657int Te6edf3portTb4b4b4) Tb4b4b4{
T8b949e// wifi setup is handled outside of this class, only starts the server
Te6edf3serverTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3portTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// ---------- public methods
Tffa657void Td2a8ffSerialWifiInterface::enableTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_isEnabledTb4b4b4) Tff7b72returnTb4b4b4;

Te6edf3_isEnabled Tff7b72= Tffa657trueTb4b4b4;
Te6edf3clearBuffersTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffSerialWifiInterface::disableTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_isEnabled Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8ffSerialWifiInterface::writeFrameTb4b4b4(Tff7b72const Tffa657uint8_t Te6edf3srcTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> Te6edf3MAX_FRAME_SIZETb4b4b4) Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffwriteFrame(), frame too big, len=%dTffea00\nTa5d6ff"Tb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3deviceConnected Tff7b72&Tff7b72& Te6edf3len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3send_queue_len Tff7b72>Tff7b72= Te6edf3FRAME_QUEUE_SIZETb4b4b4) Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffwriteFrame(), send_queue is full!Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Te6edf3send_queueTb4b4b4[Te6edf3send_queue_lenTb4b4b4]Tb4b4b4.Te6edf3len Tff7b72= Te6edf3lenTb4b4b4; T8b949e// add to send queue
Te6edf3memcpyTb4b4b4(Te6edf3send_queueTb4b4b4[Te6edf3send_queue_lenTb4b4b4]Tb4b4b4.Te6edf3bufTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3send_queue_lenTff7b72+Tff7b72+Tb4b4b4;

Tff7b72return Te6edf3lenTb4b4b4;
Tb4b4b4}
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tffa657bool Td2a8ffSerialWifiInterface::isWriteBusyTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}

Tffa657bool Td2a8ffSerialWifiInterface::hasReceivedFrameHeaderTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3received_frame_headerTb4b4b4.Te6edf3type Tff7b72!Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3received_frame_headerTb4b4b4.Te6edf3length Tff7b72!Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffSerialWifiInterface::resetReceivedFrameHeaderTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3received_frame_headerTb4b4b4.Te6edf3type Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3received_frame_headerTb4b4b4.Te6edf3length Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}

Tffa657size_t Td2a8ffSerialWifiInterface::checkRecvFrameTb4b4b4(Tffa657uint8_t Te6edf3destTb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{
T8b949e// check if new client connected
Tff7b72auto Te6edf3newClient Tff7b72= Te6edf3serverTb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3newClientTb4b4b4) Tb4b4b4{

T8b949e// disconnect existing client
Te6edf3deviceConnected Tff7b72= Tffa657falseTb4b4b4;
Te6edf3clientTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// switch active connection to new client
Te6edf3client Tff7b72= Te6edf3newClientTb4b4b4;

T8b949e// forget received frame header
Te6edf3resetReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3clientTb4b4b4.Te6edf3connectedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3deviceConnectedTb4b4b4) Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffGot connectionTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3deviceConnected Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3deviceConnectedTb4b4b4) Tb4b4b4{
Te6edf3deviceConnected Tff7b72= Tffa657falseTb4b4b4;
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffDisconnectedTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3deviceConnectedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3send_queue_len Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{ T8b949e// first, check send queue
Te6edf3_last_write Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3len Tff7b72= Te6edf3send_queueTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3lenTb4b4b4;

Tffa657uint8_t Te6edf3pktTb4b4b4[T79c0ff3Tff7b72+Te6edf3lenTb4b4b4]Tb4b4b4; T8b949e// use same header as serial interface so client can delimit frames
Te6edf3pktTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Ta5d6ff'Ta5d6ff>Ta5d6ff'Tb4b4b4;
Te6edf3pktTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3len Tff7b72& T79c0ff0xFFTb4b4b4)Tb4b4b4; T8b949e// LSB
Te6edf3pktTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3len Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4; T8b949e// MSB
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3pktTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3send_queueTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3bufTb4b4b4, Te6edf3send_queueTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3clientTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3pktTb4b4b4, T79c0ff3 Tff7b72+ Te6edf3lenTb4b4b4)Tb4b4b4;
Te6edf3send_queue_lenTff7b72-Tff7b72-Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3send_queue_lenTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ T8b949e// delete top item from queue
Te6edf3send_queueTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3send_queueTb4b4b4[Te6edf3i Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{

T8b949e// check if we are waiting for a frame header
Tff7b72ifTb4b4b4(Tff7b72!Te6edf3hasReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4{

T8b949e// make sure we have received enough bytes for a frame header
T8b949e// 3 bytes frame header = (1 byte frame type) + (2 bytes frame length as unsigned 16-bit little endian)
Tffa657int Te6edf3frame_header_length Tff7b72= T79c0ff3Tb4b4b4;
Tff7b72ifTb4b4b4(Te6edf3clientTb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3frame_header_lengthTb4b4b4)Tb4b4b4{

T8b949e// read frame header
Te6edf3clientTb4b4b4.Te6edf3readBytesTb4b4b4(Tff7b72&Te6edf3received_frame_headerTb4b4b4.Te6edf3typeTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3clientTb4b4b4.Te6edf3readBytesTb4b4b4(Tb4b4b4(Tffa657uint8_tTff7b72*Tb4b4b4)Tff7b72&Te6edf3received_frame_headerTb4b4b4.Te6edf3lengthTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;

Tb4b4b4}

Tb4b4b4}

T8b949e// check if we have received a frame header
Tff7b72ifTb4b4b4(Te6edf3hasReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4{

T8b949e// make sure we have received enough bytes for the required frame length
Tffa657int Te6edf3available Tff7b72= Te6edf3clientTb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657int Te6edf3frame_type Tff7b72= Te6edf3received_frame_headerTb4b4b4.Te6edf3typeTb4b4b4;
Tffa657int Te6edf3frame_length Tff7b72= Te6edf3received_frame_headerTb4b4b4.Te6edf3lengthTb4b4b4;
Tff7b72ifTb4b4b4(Te6edf3frame_length Tff7b72> Te6edf3availableTb4b4b4)Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffWaiting for %d more bytesTa5d6ff"Tb4b4b4, Te6edf3frame_length Tff7b72- Te6edf3availableTb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e// skip frames that are larger than MAX_FRAME_SIZE
Tff7b72ifTb4b4b4(Te6edf3frame_length Tff7b72> Te6edf3MAX_FRAME_SIZETb4b4b4)Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffSkipping frame: length=%d is larger than MAX_FRAME_SIZE=%dTa5d6ff"Tb4b4b4, Te6edf3frame_lengthTb4b4b4, Te6edf3MAX_FRAME_SIZETb4b4b4)Tb4b4b4;
Tff7b72whileTb4b4b4(Te6edf3frame_length Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4{
Tffa657uint8_t Te6edf3skipTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tffa657int Te6edf3skipped Tff7b72= Te6edf3clientTb4b4b4.Te6edf3readTb4b4b4(Te6edf3skipTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3frame_length Tff7b72-Tff7b72= Te6edf3skippedTb4b4b4;
Tb4b4b4}
Te6edf3resetReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e// skip frames that are not expected type
T8b949e// '<' is 0x3c which indicates a frame sent from app to radio
Tff7b72ifTb4b4b4(Te6edf3frame_type Tff7b72!Tff7b72= Ta5d6ff'Ta5d6ff<Ta5d6ff'Tb4b4b4)Tb4b4b4{
Te6edf3WIFI_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffSkipping frame: type=0x%x is unexpectedTa5d6ff"Tb4b4b4, Te6edf3frame_typeTb4b4b4)Tb4b4b4;
Tff7b72whileTb4b4b4(Te6edf3frame_length Tff7b72> T79c0ff0Tb4b4b4)Tb4b4b4{
Tffa657uint8_t Te6edf3skipTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tffa657int Te6edf3skipped Tff7b72= Te6edf3clientTb4b4b4.Te6edf3readTb4b4b4(Te6edf3skipTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3frame_length Tff7b72-Tff7b72= Te6edf3skippedTb4b4b4;
Tb4b4b4}
Te6edf3resetReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

T8b949e// read frame data to provided buffer
Te6edf3clientTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3destTb4b4b4, Te6edf3frame_lengthTb4b4b4)Tb4b4b4;

T8b949e// ready for next frame
Te6edf3resetReceivedFrameHeaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3frame_lengthTb4b4b4;

Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}

Tffa657bool Td2a8ffSerialWifiInterface::isConnectedTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Te6edf3deviceConnectedTb4b4b4; T8b949e//pServer != NULL && pServer->getConnectedCount() > 0;
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.11s